package produto.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import paginacao.ListaPaginada;
import aspecto.annotation.Permissao;
import br.com.sgc.entities.cep.Cidade;
import br.com.sgc.entities.cep.UF;
import br.com.sgc.entities.geral.Endereco;
import br.com.sgc.entities.geral.Telefone;
import br.com.sgc.entities.produto.Fornecedor;
import br.com.sgc.enuns.TipoOrdenacao;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.permissao.Role;
import br.com.sgc.session.FornecedorSession;
import br.com.sgc.session.PessoaSession;

@Named
@ConversationScoped
public class FornecedorManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = 1364584874360105825L;
	
	private Fornecedor fornecedor = new Fornecedor();
	
	private Fornecedor fornecedorSearch = new Fornecedor();
	
	private List<Fornecedor> list = new ArrayList<Fornecedor>();
	
	private Boolean isCnpjValido;
	
	private Boolean isTelaAtendimento;
	
	@EJB private PessoaSession pessoaSession;
	
	@EJB private FornecedorSession fornecedorSession;
	
	@Inject private UtilManager utilManager;

	private Boolean showPanelCadastro;
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Salvar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String prepareSave(){
		clear();
		showPanelCadastro = true;
		fornecedor = new Fornecedor();
		fornecedor.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		return "formFornecedor";
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Salvar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String save() {
		try {
			fornecedor.setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(),fornecedor));
			fornecedor.setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(),fornecedor));
			pessoaSession.save(fornecedor);
			FacesUtil.mensInfo("Salvo Com Sucesso!");
			return list();
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensWarn(e.getMessage());
		}
		return null;
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Atualizar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String update() {
		try {
			fornecedor.setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(),fornecedor));
			fornecedor.setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(),fornecedor));
			pessoaSession.update(fornecedor);
			FacesUtil.mensInfo("Atualizado Com Sucesso!");
			return list();
		} catch (ValidacaoException e) {
			e.printStackTrace();
			FacesUtil.mensWarn(e.getMessage());
		}
		return null;
	}
	
	@Permissao(role = Role.Sistema_SGC_Paciente_Excluir)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String delete(){
		try {
			pessoaSession.delete(fornecedor);
			FacesUtil.mensInfo("Excluído com Sucesso!!!");
		} catch (Exception e) {
			FacesUtil.mensInfo("Impossível Excluir");
		}
		
		return list();
	}

	
	@Permissao(role = Role.Sistema_SGC_Paciente_Listar)
	public String list() {
		fornecedor = new Fornecedor();
		list = new ListaPaginada<Fornecedor>(fornecedorSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), null, 5, "id", TipoOrdenacao.DESC);
		utilManager.getEnderecoManager().setRenderPanelCadastro(false);
		utilManager.getTelefoneManager().setRenderPanelCadastro(false);
		showPanelCadastro = false;
		return "formFornecedor";
	}
	
	public void search(){
		list = new ListaPaginada<Fornecedor>(fornecedorSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), fornecedorSearch, 5, "id", TipoOrdenacao.DESC);
		showPanelCadastro = false;
	}

	@Permissao(role = Role.Sistema_SGC_Paciente_Atualizar)
	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public String prepareUpdate(){
		utilManager.getEnderecoManager().setRenderPanelCadastro(true);
		utilManager.getTelefoneManager().setRenderPanelCadastro(true);
		
		fornecedor = fornecedorSession.findById(Fornecedor.class, fornecedor.getId(), true);
		
		utilManager.getEnderecoManager().getListEndereco().clear();
		utilManager.getTelefoneManager().getListTelefone().clear();
		
		fornecedor.setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().getEnderecosPersistent(fornecedor.getEnderecos()));
		fornecedor.setTelefones(utilManager.getTelefoneManager().getTelefoneSession().getTelefonesPersistent(fornecedor.getTelefones()));
		
		utilManager.getEnderecoManager().getListEndereco().addAll(fornecedor.getEnderecos());
		utilManager.getTelefoneManager().getListTelefone().addAll(fornecedor.getTelefones());
		
		
		fornecedor.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		showPanelCadastro = true;
		isCnpjValido = true;
		isTelaAtendimento = false;
		
		return "formFornecedor";
	}
	
	public void validateCnpj() {
		try {
			isCnpjValido = false;
			String cnpj = fornecedor.getCnpj();
			pessoaSession.validarCnpj(cnpj);
			fornecedor = fornecedorSession.findByCnpj(cnpj, fornecedor.getClinica().getId());
			
			if(fornecedor == null){
				fornecedor = new Fornecedor();
				fornecedor.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
				fornecedor.setCnpj(cnpj);
			}
			
			utilManager.getEnderecoManager().setRenderPanelLogradouro(false);
			utilManager.getEnderecoManager().setListCidade(new ArrayList<Cidade>());
			utilManager.getEnderecoManager().setListUF(new ArrayList<UF>());
			utilManager.getEnderecoManager().setRenderPanelCadastro(true);
			utilManager.getTelefoneManager().setRenderPanelCadastro(true);
			
			utilManager.getTelefoneManager().getListTelefone().clear();
			utilManager.getTelefoneManager().setTelefone(new Telefone());
			
			utilManager.getEnderecoManager().setEndereco(new Endereco());
			utilManager.getEnderecoManager().getListEndereco().clear();
			
			utilManager.getEnderecoManager().setListEndereco(fornecedor.getEnderecos());
			utilManager.getTelefoneManager().setListTelefone(fornecedor.getTelefones());
			
			isCnpjValido = true;

		} catch (ValidacaoException e) {
			FacesUtil.mensWarn(e.getMessage());
		}
	}
	
	public void clear(){
		utilManager.getEnderecoManager().setRenderPanelLogradouro(false);
		utilManager.getEnderecoManager().setListCidade(new ArrayList<Cidade>());
		utilManager.getEnderecoManager().setListUF(new ArrayList<UF>());
		utilManager.getEnderecoManager().setRenderPanelCadastro(true);
		utilManager.getTelefoneManager().setRenderPanelCadastro(true);
		
		utilManager.getTelefoneManager().getListTelefone().clear();
		utilManager.getTelefoneManager().setTelefone(new Telefone());
		
		utilManager.getEnderecoManager().setEndereco(new Endereco());
		utilManager.getEnderecoManager().getListEndereco().clear();
		
		fornecedor = new Fornecedor();
		fornecedor.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		isCnpjValido = false;
		isTelaAtendimento = false;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public List<Fornecedor> getList() {
		return list;
	}

	public void setList(List<Fornecedor> list) {
		this.list = list;
	}

	public Boolean getIsCnpjValido() {
		return isCnpjValido;
	}

	public void setIsCnpjValido(Boolean isCnpjValido) {
		this.isCnpjValido = isCnpjValido;
	}

	public Boolean getIsTelaAtendimento() {
		return isTelaAtendimento;
	}

	public void setIsTelaAtendimento(Boolean isTelaAtendimento) {
		this.isTelaAtendimento = isTelaAtendimento;
	}

	public FornecedorSession getFornecedorSession() {
		return fornecedorSession;
	}

	public void setFornecedorSession(FornecedorSession fornecedorSession) {
		this.fornecedorSession = fornecedorSession;
	}

	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}

	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}

	public Fornecedor getFornecedorSearch() {
		return fornecedorSearch;
	}

	public void setFornecedorSearch(Fornecedor fornecedorSearch) {
		this.fornecedorSearch = fornecedorSearch;
	}
}
